#include <memory.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

int new() {
    return 11;
}

int template_new()
{
    typedef int (*p_fun)();
    char code[] = {
        0x55, // pushq %rbp
        0x48, 0x89, 0xe5, // movq %rsp, %rbp
        0xb8, 0x0b, 0x00, 0x00, 0x00, // movl $0x0b, %eax
        0x5d, // popq %rbp
        0xc3 // ret
    };

    // 相当于在内存中开辟一片可读可写可执行的区域（准确说是一页），然后把code数组的内容拷贝进去
    void *temp = mmap(
        NULL,
        getpagesize(),
        PROT_READ | PROT_WRITE | PROT_EXEC,
        MAP_ANONYMOUS | MAP_PRIVATE,
        -1,
        0
    );
    memcpy(temp, code, sizeof(code));

    // 如果用以下语句不通过mmap的话，会报段错误
    // p_fun fun = (p_fun) &code[0];
    p_fun fun = (p_fun) temp;
    return fun();
}

int main()
{
    int obj = new();
    int obj2 = template_new();

    printf("%d\n", obj);
    printf("%d\n", obj2);
    return 0;
}